/* vim: set ts=2 et sw=2 cindent fo=qroca: */

package com.globant.google.mendoza.malbec;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.gargoylesoftware.htmlunit.KeyValuePair;
import com.globant.google.mendoza.malbec.schema._2.CheckoutShoppingCart;

/**
 * The xml implementation of the CartEncoder.
 * Used to encodes and sign an xml representation of a CheckoutShoppingCart.
 */
public final class XmlCartEncoder implements CartPostEncoder {

  /**
   * The class logger.
   */
  private static Log log = LogFactory.getLog(XmlCartEncoder.class);

  /**
   * Generates the post parameterse needed to place an order:
   * cart: contains the base64 encoded cart.
   * signature: contains the base64 encoded cart signed with the received key.
   * @param cart The cart to be encoded.
   * @param key The key used to sign the encoded cart.
   * @return Returns a key/value pair containing the needed parameters to place
   *  an order.
   */
  public List<KeyValuePair> generateParameters(final CheckoutShoppingCart cart,
      final String key) {
    log.trace("Entering generateParameters");

    final String xmlCart = CartUtils.toXml(cart);

    if (log.isTraceEnabled()) {
      log.trace("Generating parameters for this cart:\n" + xmlCart);
    }
    List<KeyValuePair> parameters = new ArrayList<KeyValuePair>();

    log.debug("Encoding the cart");
    final String encodedCart = Encoder.encode(xmlCart);

    log.debug("Signing the cart");
    final String signedCart = Encoder.sign(xmlCart, key);

    parameters.add(new KeyValuePair("cart", encodedCart));

    parameters.add(new KeyValuePair("signature", signedCart));

    log.trace("Leaving generateParameters");
    return parameters;
  }

  /**
   * Generates the post parameters needed to place an order:
   * cart: contains the base64 encoded cart.
   * signature: contains the base64 encoded cart signed with the received key.
   * @param theCart The cart to be posted.
   * @param theKey The key used to sign the encoded cart.
   * @return Returns a key/value pair containing the needed parameters to place
   *  an order.
   */
  public List<KeyValuePair> generateParameters(final String theCart,
      final String theKey) {
    List<KeyValuePair> parameters = new ArrayList<KeyValuePair>();
    if (log.isTraceEnabled()) {
      log.trace("Generating parameters for this cart:\n" + theCart);
    }
    final String encodedCart = Encoder.encode(theCart);
    final String signedCart = Encoder.sign(theCart, theKey);

    parameters.add(new KeyValuePair("cart", encodedCart));
    parameters.add(new KeyValuePair("signature", signedCart));
    return parameters;
  }

  /**
   * Returns the body of the request for posting the cart. As the cart goes as
   * an encoded parameter, this method just returns null.
   * @param theCart the cart to be posted.
   * @return null.
   */
  public String getBodyForCart(final CheckoutShoppingCart theCart) {
    return null;
  }

  /**
   * Returns the body of the request for posting the cart. As the cart goes as
   * an encoded parameter, this method just returns null.
   * @param theCart the cart to be posted.
   * @return null.
   */
  public String getBodyForCart(final String theCart) {
    return null;
  }
}
